package com.whut.utils;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.util.Map;

public class MDoc {
    private Configuration configuration = null;

    public MDoc() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
    }

    public void createDoc(Map<String, Object> dataMap, String fileName, String ftlName) throws UnsupportedEncodingException {
        // dataMap 要填入模本的数据文件
        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet，classpath，数据库装载，
        configuration.setClassForTemplateLoading(this.getClass(), "/");
        Template t = null;
        try {
            // test.ftl为要装载的模板
            t = configuration.getTemplate(ftlName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 输出文档路径及名称
        File outFile = new File(fileName);
        Writer out = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outFile);
            OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
            // 这个地方对流的编码不可或缺，使用main（）单独调用时，应该可以，但是如果是web请求导出时导出后word文档就会打不开，并且包XML文件错误。主要是编码格式不正确，无法解析。
            out = new BufferedWriter(new OutputStreamWriter(new
                    FileOutputStream(outFile)));
            out = new BufferedWriter(oWriter);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        try {
            t.process(dataMap, out);
            out.close();
            fos.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static boolean isFoundImageStr(String imgFile) {
        File file = new File(imgFile);
        if (file.exists()) {
            return true;
        } else {
            return false;
        }
    }

    public static String getImageStr(String imgFile) throws NullPointerException {
        InputStream inputStream = null;
        byte[] data = null;
        try {
            inputStream = new FileInputStream(imgFile);
            data = new byte[inputStream.available()];
            inputStream.read(data);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 加密
        /*Encoder encoder = Base64.getEncoder();
        return encoder.encodeToString(encoder.encode(data));*/
        return new BASE64Encoder().encode(data);
    }

    public static void docToDocx(String sourcePath, String targetPath) {
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        app.setProperty("Visible", false);
        Dispatch docs = app.getProperty("Documents").toDispatch();
        Dispatch doc = Dispatch.call(docs, "Open", sourcePath).getDispatch();
        File f = new File(targetPath);
        if (f.exists()) {
            f.delete();
        }
        Dispatch.call(doc, "SaveAS", targetPath, 12);
        Dispatch.call(doc, "Close", false);
        app.invoke("Quit", 0);
    }

    public static void docxToPdf(String sourcePath, String targetPath) {

    }

}
